#include "SGPCLRegionGrowing.h"

namespace sgpcl
{
SGRegionGrowConfig::SGRegionGrowConfig()
  : SGPCLJsonConfig()
  , nNeigbourNum(30)  // 区域生长时的邻域数量（用于计算法向和曲率）
  , nMinPntNum(100)   // 簇的最小点数
  , fNormalDiff(-1.f) // 法向量夹角变化阈值（用于生长条件）
  , fCurveDiff(-1.f)  // 曲率变化阈值（用于生长条件）
  , fResidual(-1.f)   // 残差阈值（用于生长条件）
{
}

void SGRegionGrowConfig::ParseJson(const rapidjson::Value& sJsonRoot)
{
  SGPCLJsonConfig::ParseJson(sJsonRoot, "区域生长算法");

  // 区域生长使用的临近点数量
  rapidjson::Value::ConstMemberIterator itMember = sJsonRoot.FindMember("NeigbourNum");
  if (itMember != sJsonRoot.MemberEnd())
  {
    nNeigbourNum = itMember->value.GetInt();
  }
  else
  {
    SG_LOG("未指定\"区域生长使用的临近点数量\"，采用默认值\"" + std::to_string(nNeigbourNum));
  }

  // 结构面最小点数
  itMember = sJsonRoot.FindMember("MinPntNum");
  if (itMember != sJsonRoot.MemberEnd())
  {
    nMinPntNum = itMember->value.GetInt();
  }
  else
  {
    SG_LOG("未指定\"簇的最小点数\"，采用默认值\"" + std::to_string(nMinPntNum));
  }

  // 法向量夹角变化阈值（用于生长条件）
  itMember = sJsonRoot.FindMember("NormalDiff");
  if (itMember != sJsonRoot.MemberEnd())
  {
    fNormalDiff = itMember->value.GetFloat();
  }
  // 曲率变化阈值（用于生长条件）
  itMember = sJsonRoot.FindMember("CurveDiff");
  if (itMember != sJsonRoot.MemberEnd())
  {
    fCurveDiff = itMember->value.GetFloat();
  }
  // 残差值阈值（用于生长条件）
  itMember = sJsonRoot.FindMember("Residual");
  if (itMember != sJsonRoot.MemberEnd())
  {
    fResidual = itMember->value.GetFloat();
  }

  if (fNormalDiff < 0 && fCurveDiff < 0 && fResidual < 0)
  {
    SG_PANIC("法向量夹角变化阈值、曲率变化阈值、残差值阈值至少设定一个以进行区域生长算法");
  }
}

}
